@局外人
1年前 提问
1个回答

Systemd 的沙盒功能主要有哪些

安全小白成长记
1年前

systemd的沙盒功能主要有以下这些:

  • 限制文件读写和访问权限:为进程设置一个新的文件系统名字空间,也就是限制进程可访问的文件系统范围。每个选项的值都是一个以空格分隔的绝对路径列表。注意,这里所说的“绝对路径”实际上是以主机或容器根目录(也就是运行systemd的系统根目录)为基准的绝对路径。如果路径是一个软连接,那么在追踪软连接时将以RootDirectory=/RootImage=设置的根目录为基准。对于ReadWritePaths=中列出的路径,进程从名字空间内访问与从外部访问的权限是一样的。对于ReadOnlyPaths=中列出的路径,即使进程从外部访问时拥有写入权限,当从名字空间内访问时,进程也依然只能拥有只读权限。将ReadWritePaths=嵌套于ReadOnlyPaths=内,可以将可写子目录嵌套在只读目录内。当ProtectSystem=strict时,可以使用ReadWritePaths=设置可写入路径的白名单。对于InaccessiblePaths=中的路径,进程从名字空间内访问时没有任何权限(既不能读取也不能写入)。

  • 限制syscall系统调用:设置进程的系统调用过滤器,SystemCallFilter的值是一个以空格分隔的系统调用名称列表(默认为白名单)。如果进程使用了列表之外的系统调用,则将会立即被SIGSYS信号杀死,这时可以在列表开头添加~字符(表示反转),将其列入黑名单,也就是仅禁止列表中列出的系统调用。如果进程在用户模式下运行或者在不含CAP_SYS_ADMIN capability的系统模式下(例如设置了User=nobody)运行,那么SystemCallFilter将自动隐含NoNewPrivileges=yes的设置。该选项依赖于内核的Secure Computing Mode 2接口(seccomp filtering),常用于强制建立一个最小化的沙盒环境。注意execve、exit、exit_group、getrlimit、rt_sigreturn、sigreturn以及查询系统时间与暂停执行(sleep)的系统调用是默认隐含于白名单中的。上述配置可以被多次使用以融合多个过滤器。若将SystemCallFilter选项的值设为空,则表示清空先前所有已设置的过滤器,此选项不影响带有“+”前缀的命令。

  • 限制用户权限:将PrivateUsers的值设为yes表示为进程设置一个新的用户名字空间,并仅在其中保留最小化的user/group映射。具体说来就是仅在该名字空间内保留“root”用户与组,以及单元自身的用户与组,同时将所有其他用户与组统一映射到“nobody”用户与组,这样就可以安全地将该单元所使用的user/group数据库从主机系统中剥离出来了,从而为该单元创建一个有效的沙盒环境。所有不属于“root”或该单元自身用户的文件、目录、进程、IPC对象等资源,在该单元内部依然可见,但是它们将会变为全部属于“nobody”用户与组的资源。开启此选项之后,无论单元自身的用户与组是否为“root”,在主机的名字空间内,该单元内的所有进程都将以非特权用户身份运行。特别地,这意味着该单元内的进程在主机的名字空间内没有任何能力(capability),但是在该单元的用户名字空间内部,仍然拥有全部capability。诸如CapabilityBoundingSet=之类的设置,其默认值是no,意味着其进程仅在该单元的用户名字空间内部有意义,而不是在整个主机的名字空间内有意义。PrivateUsers选项在与RootDirectory=/RootImage=一起使用时比较有意义,因为在此场景中仅需要映射“root”“nobody”以及单元自身的用户与组。

  • 限制网络访问:将PrivateNetwork的值设为yes,表示为进程设置一个新的网络名字空间,并在其中仅配置一个“lo”本地回环设备,不配置任何物理网络设备,这可以有效关闭进程对实际物理网络的访问。通过JoinsNamespaceOf=选项可以将多个单元运行在同一个私有的网络名字空间中。注意,此选项将会从主机断开所有套接字(包括AF_NETLINK与AF_UNIX),同时,进程也无法访问那些位于抽象套接字名字空间中的AF_UNIX套接字(不过依然可以访问位于文件系统上的AF_UNIX套接字)。PrivateNetwork的默认值是no。